package com.service.user;

import com.entity.Goods;
import com.entity.GoodsBasic;

import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface GoodService {

  /**
   * 获取分页书籍
   *
   * @param pageSize 页大小
   * @param pageIndex 页索引
   * @param status 书籍状态
   * @param fromPrice 最低价
   * @param toPrice 最高价
   * @param categoryId 种类编号
   * @param name 书名
   * @param userId 卖家编号
   * @param fromUpdateTime 最早更新时间
   * @param toUpdateTime 最迟更新时间
   * @param fromPublicDate 最早出版日期
   * @param toPublicDate 最迟出版日期
   * @param author 作者
   * @param appearance 品相
   * @param pressHorse 出版社
   * @param sortWay 排序方式
   * @return 筛选出的分页书籍
   */
  List<Goods> getGoods(
      int pageSize,
      int pageIndex,
      String goodId,
      int status,
      Float fromPrice,
      Float toPrice,
      Integer categoryId,
      String name,
      String userId,
      Date fromUpdateTime,
      Date toUpdateTime,
      Date fromPublicDate,
      Date toPublicDate,
      String author,
      String appearance,
      String pressHorse,
      String sortWay);
  /**
   * 走马灯推荐书籍编号及其图片
   *
   * @param userId 用户编号
   * @param count 获取的数量
   * @return 对应数量的推荐商品
   */
  // TODO 根据登录用户做优化
  List<Map<String, String>> getMostPopular(String userId, int count);

  /**
   * 获取主页分类展示书籍的列表
   *
   * @param categoryNum 获取的种类数目
   * @param goodsNum 每个类别的商品数量
   * @return 分类展示书籍的列表
   */
  // TODO 这里关于书籍列表的还没处理好
  List<Map<String, Object>> getShowGoods(int categoryNum, int goodsNum);

  /**
   * 获取书籍详情
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @return 商品详情
   */
  Goods getGoodDetail(String userId, String goodId, int minStatus);

  /**
   * 更新浏览次数(sql语句里不是自己的商品才会更新浏览次数）
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @return 更新成功返回1，失败返回0
   */
  int updateGoodVisit(String userId, String goodId);

  /**
   * 获取商品的基本信息
   *
   * @param goodId 商品编号
   * @param minStatus 最小的状态(只能查询到比该状态大或等于该状态的商品信息)
   * @return 商品的基本信息
   */
  GoodsBasic getGoodsBasicById(String goodId, int minStatus);

  /**
   * 获取卖家信息
   *
   * @param goodId 商品编号
   * @return 卖家昵称nickname和用户编号userId
   */
  Map<String, String> getSeller(String goodId);

  /**
   * 根据关键字搜索
   *
   * @param keywords 关键字
   * @param sortBy sortBy 0->综合排序，1->价格，2->品相，3->卖家评分
   * @param sortWay sortWay 升序asc/或降序desc
   * @param pageSize 页大小
   * @param pageIndex 页索引
   * @return 指定页的商品搜索结果
   */
  List<GoodsBasic> searchGoods(
      String keywords, int sortBy, String sortWay, int pageSize, int pageIndex);

  /**
   * 获取相关书籍
   *
   * @param goodId 书籍编号
   * @return 相关书籍列表
   */
  List<GoodsBasic> getRelevantGoods(String goodId);

  /**
   * 浏览过这本书的人也浏览过
   *
   * @param goodId 商品编号
   * @param count 获取数量
   * @return 浏览过这本书的人也浏览过的书籍
   */
  List<GoodsBasic> getAlsoViewGoods(String goodId, int count, String userId);

  /**
   * 获取相关分类
   *
   * @param goodId 书籍编号
   * @return 相关分类列表
   */
  List<Map<String, Object>> getRelevantCategories(String goodId);

  /**
   * 举报商品
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @param type 举报类型
   * @param reason 举报原因
   * @param pic1 截图1
   * @param pic2 截图2
   * @param pic3 截图3
   * @return 举报成功返回1，失败返回0
   */
  int reportGood(
      String userId,
      String goodId,
      String type,
      String reason,
      MultipartFile pic1,
      MultipartFile pic2,
      MultipartFile pic3);

  /**
   * 删除商品更多图片或视频
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @param fileURL 要删除的文件的url
   * @return 删除成功返回1，否则返回0
   */
  int delGoodMoreFile(String userId, String goodId, String fileURL);

  /**
   * 修改商品状态
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @param newStatus 新的状态
   * @return 修改成功返回1，否则返回0
   */
  int chGoodStatus(String userId, String goodId, int newStatus);

  /**
   * 更接一个卖家的所有商品的状态（除已删除）
   *
   * @param userId 卖家编号
   * @param newStatus 新的状态
   * @return 更新的条数
   */
  int chUserAllGoodsStatus(String userId, int newStatus);

  /**
   * 删除商品
   *
   * @param userId 用户编号
   * @param goodId 商品编号
   * @return 删除成功返回0=1，否则返回0
   */
  int delGood(String userId, String goodId);

  List<Map<String, Object>> getTypeGoodCount();

  /**
   * 获取该书籍作者的其他书籍
   */
  List<GoodsBasic> getAuthorGoods(String goodId);
}
